package com.yfs.bus.strategy;

import com.yfs.bus.builder.BusFactory;
import com.yfs.bus.entity.BasePrice;
import com.yfs.bus.entity.Bus;
import com.yfs.bus.exception.BussinessException;
import lombok.Data;

import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @description: 出租车打车策略
 * @param:
 * @return:
 * @author: xia
 * @time: 2022/4/13 11:45
 */
@Data
public class BusStrategy {

    public static ConcurrentHashMap<Integer, Bus> busMap = new ConcurrentHashMap();


    /**
     * @description: 初始化出租车类型数据
     * @param:
     * @return:
     * @author: xia
     * @time: 2022/4/13 14:13
     */
    static {
        //MinBuss 白天价格
        LinkedList<BasePrice> minDayPrice = new LinkedList<>();
        //0-3公里起步价,14元
        minDayPrice.add(BasePrice.builder()
                .price(new BigDecimal("14"))
                .beginKm(0)
                .endKm(3)
                .priceType(1)
                .build());
        //3-10公里每公里2.5元
        minDayPrice.add(BasePrice.builder()
                .price(new BigDecimal("2.5"))
                .beginKm(3)
                .endKm(10)
                .priceType(2)
                .build());
        //大于10公里每公里3.5元
        minDayPrice.add(BasePrice.builder()
                .price(new BigDecimal("3.5"))
                .beginKm(3)
                .endKm(10)
                .priceType(2)
                .build());
        //MinBuss 晚上价格
        LinkedList<BasePrice> minNightPrice = new LinkedList<>();
        //0-3公里起步价,14元
        minNightPrice.add(BasePrice.builder()
                .price(new BigDecimal("18"))
                .beginKm(0)
                .endKm(3)
                .priceType(1)
                .build());
        //3-10公里每公里2.5元
        minNightPrice.add(BasePrice.builder()
                .price(new BigDecimal("3"))
                .beginKm(3)
                .endKm(10)
                .priceType(2)
                .build());
        //大于10公里每公里3.5元
        minNightPrice.add(BasePrice.builder()
                .price(new BigDecimal("4.7"))
                .beginKm(10)
                .endKm(-1)
                .priceType(2)
                .build());

        //MaxBuss 白天价格
        LinkedList<BasePrice> maxDayPrice = new LinkedList<>();
        //0-3公里起步价,14元
        maxDayPrice.add(BasePrice.builder()
                .price(new BigDecimal("14"))
                .beginKm(0)
                .endKm(3)
                .priceType(1)
                .build());
        //大于3公里每公里2.5元
        maxDayPrice.add(BasePrice.builder()
                .price(new BigDecimal("2.5"))
                .beginKm(3)
                .endKm(-1)
                .priceType(2)
                .build());
        //MinBuss 晚上价格
        LinkedList<BasePrice> maxNightPrice = new LinkedList<>();
        //0-3公里起步价,18元
        maxNightPrice.add(BasePrice.builder()
                .price(new BigDecimal("18"))
                .beginKm(0)
                .endKm(3)
                .priceType(1)
                .build());
        //大于3公里每公里3元
        maxNightPrice.add(BasePrice.builder()
                .price(new BigDecimal("3"))
                .beginKm(3)
                .endKm(-1)
                .priceType(2)
                .build());

        //若是spring项目，Bus 可自定义注解(type类型放在注解里)，从ioc容器中获取
        Bus minBus = BusFactory.getInstance(1, minDayPrice, minNightPrice);
        Bus maxBus = BusFactory.getInstance(2, maxDayPrice, maxNightPrice);
        busMap.put(minBus.getType(), minBus);
        busMap.put(maxBus.getType(), maxBus);
    }

    /**
     * @description: 根据出租车类型获取出租车实例
     * @param:
     * @return:
     * @author: xia
     * @time: 2022/4/13 15:27
     */
    public static Bus findStrategy(Integer type) {
        Bus bus = busMap.get(type);
        if(Objects.isNull(bus)){
            throw new BussinessException("没有找到对应类型的出租车");
        }
        return bus;
    }

}
